package com.skh.array;

import java.util.Arrays;

/**
 * @Author: skh
 * @Date: 2019/6/25 11:12
 * @Description:
 */
public class SortArrayByParityII {

    /*
    给定一个非负整数数组 A， A 中一半整数是奇数，一半整数是偶数。

    对数组进行排序，以便当 A[i] 为奇数时，i 也是奇数；当 A[i] 为偶数时， i 也是偶数。

    你可以返回任何满足上述条件的数组作为答案。

    示例：

    输入：[4,2,5,7]
    输出：[4,5,2,7]
    解释：[4,7,2,5]，[2,5,4,7]，[2,7,4,5] 也会被接受。

     */

    /*
    思路：找到奇指针不满足的位置；找到偶指针不满足的位置；交换即可；
     */
    public int[] sortArrayByParityII(int[] A) {
        int odd = 1; //奇指针
        int even = 0; //偶指针
        int length = A.length;

        while (odd < length && even < length) {

            //找到奇指针对应的数不为奇数的地方
            while (odd < length && A[odd] % 2 != 0) {
                odd += 2;
            }

            //找到偶指针对应的数不为偶数的地方
            while (even < length && A[even] % 2 == 0) {
                even += 2;
            }

            //交换
            if (odd < length && even < length) {
                int temp = A[odd];
                A[odd] = A[even];
                A[even] = temp;
            }

        }

        return A;
    }

    /*
  思路：
  * 1. 设定两个标识符，奇数和偶数位
 * 2. 循环原数组，添加到新数组中
 * 3. 添加的规则是：遇到奇数，添加到新数组中最小的奇数位。遇到偶数，添加到新数组中最小的偶数位。
   */
    public int[] sortArrayByParityII2(int[] A) {
        int[] result = new int[A.length];
        int odd =1;
        int even = 0;

        for (int i = 0; i < A.length; i++) {
            if (A[i] % 2 == 0) {
                result[even] = A[i];
                even+=2;
            }else {
                result[odd] = A[i];
                odd+=2;
            }
        }

        return result;
    }

    public static void main(String[] args) {
        SortArrayByParityII sortArrayByParityII = new SortArrayByParityII();
        int[] A = {4, 2, 5, 7};
        int[] ints = sortArrayByParityII.sortArrayByParityII(A);
        System.out.println("Arrays.toString(ints) = " + Arrays.toString(ints));
    }
}
